﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TwitterDotNet.Core
{
    /// <summary>
    /// アカウントを管理するクラス
    /// </summary>
    public sealed class Account
    {
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="username">ユーザーネーム、もしくはメールアドレス</param>
        /// <param name="password">パスワード</param>
        public Account(string username, string password)
        {
            if (username == null)
                throw new ArgumentNullException("username");
            if (username == "")
                throw new ArgumentException("username is invalid");

            if (password == null)
                throw new ArgumentNullException("password");
            if (username == "")
                throw new ArgumentException("password is invalid");

            Username = username;
            Password = password;
        }

        /// <summary>
        /// ユーザーネームを取得
        /// </summary>
        public string Username
        {
            get;
            private set;
        }

        /// <summary>
        /// パスワードを取得
        /// </summary>
        public string Password
        {
            get;
            private set;
        }
    }

    /// <summary>
    /// Oauth認証によるアカウントを管理するクラス
    /// </summary>
    public sealed class OauthAccount
    {
        /// <summary>
        /// コンストラクタ
        /// 初回ログイン
        /// </summary>
        /// <param name="consumerkey">コンシューマキー</param>
        /// <param name="consumersecret">コンシューマシークレット</param>
        public OauthAccount(string consumerkey, string consumersecret)
        {
            Oauth = new Oauth(consumerkey, consumersecret);
            IsLogin = false;
            Oauth.GetRequestToken();
            LoginUrl = Oauth.GetAuthorizeUrl();
        }

        /// <summary>
        /// 2回目以降ログイン
        /// </summary>
        /// <param name="consumerkey">コンシューマキー</param>
        /// <param name="consumersecret">コンシュマーシークレット</param>
        /// <param name="accesstoken">アクセストークン</param>
        /// <param name="accesssecret">アクセスシークレット</param>
        /// <param name="userid">ユーザID</param>
        /// <param name="screenname">スクリーンネーム</param>
        public OauthAccount(string consumerkey, string consumersecret, string accesstoken, string accesssecret, int userid, string screenname)
        {
            Oauth = new Oauth(consumerkey, consumersecret, accesstoken, accesssecret, userid.ToString(), screenname);
            IsLogin = true;
            Oauth.GetRequestToken();
            LoginUrl = Oauth.GetAuthorizeUrl();
        }

        public OauthAccount(Oauth oauth) : this(oauth.ConsumerKey, oauth.ConsumerSecret, oauth.AccessToken, oauth.AccessTokenSecret, int.Parse( oauth.UserId), oauth.ScreenName)
        {
            IsLogin = true;
        }

        /// <summary>
        /// 認証ページのURLを取得
        /// </summary>
        public string LoginUrl { get; private set; }

        /// <summary>
        /// ログインするメソッド
        /// </summary>
        /// <param name="pin">認証番号</param>
        public void Login(string pin)
        {
            Oauth.GetAccessToken(pin);
            IsLogin = true;
        }

        /// <summary>
        /// ログインしているか取得
        /// </summary>
        public bool IsLogin { get; private set; }
        internal Oauth Oauth { get; set; }
    }
}
